// 引入 Koa 构造函数
const Koa = require('koa');
// 创建 Koa 实例
const app = new Koa();

// 引入 KoaRouter 构造函数
const KoaRouter = require('koa-router');
// 根据构造函数，创建路由实例
const router = new KoaRouter();

// 引入解析请求体数据的中间件
const bodyparser = require('koa-bodyparser');
// 启用 bodyParser 中间件
app.use(bodyparser());

// 引入 Node 核心模块 fs
const { writeFile, readFile } = require('fs');

// Node 最开始提倡使用 callback 的方式来处理异步编程
// promise 、async / awiat
const { promisify } = require('util');
// await 只能用在返回 promise 对象的方法

router.post('/users', async (ctx) => {
    ctx.body = '添加用户';
    // 获取请求体参数
    const params = ctx.request.body;
    console.log('params', params);
    // 保存数据
    // 可以把用户的数据保存到文件中（保存简单的数据）
    // console.log(JSON.stringify(params));
    // 存入文件中
    writeFile('./userList.json', JSON.stringify(params), 'utf8', (error) => {
        if (error) return console.log('写入文件内容失败', error.message);
    });
    // 设置响应码
    // ctx.status = 201;
    // 用户信息存储成功了
    ctx.body = {
        code: 201,
        message: '添加用户信息成功',
    };
    // 把用户的数据保存到数据库（数据之间可能存在复制的关联关系，对于复杂的应用，我们应该是存到数据库中，来保存这种复杂的数据关系）
});

router.get('/users', async (ctx) => {
    // ctx.body = '获取用户列表';
    // 获取查询参数
    // let params = ctx.query;
    // console.log('params', params);
    // 从文件里面拿数据
    await readFile('./userList.json', 'utf8', (error, users) => {
        if (error) return console.log('读取用户信息失败', error.message);
        console.log('users', users);
        ctx.body = {
            code: 200,
            data: {
                users,
            },
            message: '读取用户信息成功',
        };
    });
    // 从数据库里面拿数据
    ctx.body = '读取用户信息';
});

router.put('/users/:id', async (ctx) => {
    ctx.body = '修改用户信息';
    // 获取路径参数
    const params = ctx.params;
    console.log('params', params);
    // 更新数据库中的用户信息
});

router.delete('/users/:id', async (ctx) => {
    ctx.body = '删除用户';
    // 从数据库中，把用户信息给删除了
});

// 加载路由
app.use(router.routes());

// 监听端口，启动 web 服务
app.listen(3000, () => {
    console.log('Koa server listening at http://localhost:3000');
});
